home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
archiver
/
ltarv3.zip
/
XD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-11-08
|
2KB
|
117 lines
#include <ctype.h>
#include <dos.h>
#include <dir.h>
#include <errno.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys\stat.h>
#define MAXPAT 256
char curDir[MAXPAT] ;
char tDrv[3], tDir[MAXPAT], tName[9], tExt[5] ;
char *loc ;
int halt = 0, recur = 0 ;
struct fcb tag ;
struct REGPACK regs ;
void error( char *fname, char *cau ) {
fprintf( stderr, "%s error : %s ", cau, fname ) ;
switch ( errno ) {
case ENOENT :
fputs( "path or file not found.\n", stderr ) ;
break ;
case EACCES :
fputs( "permission denied.\n", stderr ) ;
break ;
default :
fprintf( stderr, "error no - %d\n", errno ) ;
}
}
void usage( void ) {
fprintf( stderr, "Usage: XD [Dir]\n\te.g. XD F:\\TEMP\\ or XD TEMP\\\n" ) ;
exit( - 1 ) ;
}
attachTarget( char *loc ) {
int c ;
char d ;
c = fnsplit( loc, tDrv, tDir, tName, tExt ) ;
if ( c & DRIVE ) {
d = toupper( tDrv[0] ) - 'A' ;
setdisk( d ) ;
if ( getdisk() != d )
return 0 ;
}
if ( c & DIRECTORY )
if ( chdir( tDir ) ) {
tDir[strlen( tDir ) - 1] = 0 ;
if ( chdir( tDir ) )
return 0 ;
}
if ( c & FILENAME )
usage() ;
regs.r_ds = FP_SEG( &tag ) ;
regs.r_ax = 0x1300 ;
regs.r_dx = FP_OFF( &tag ) ;
return 1 ;
}
int d ;
void recusiveSearch( void ) {
struct ffblk dir ;
int c ;
for ( c = findfirst( "*.*", &dir, FA_DIREC | FA_ARCH ) ; !c ;
c = findnext( &dir ) ) {
d = dir.ff_attrib ;
loc = dir.ff_name ;
if ( d & FA_DIREC ) {
if ( *loc != '.' ) {
chdir( loc ) ;
recusiveSearch() ;
loc = dir.ff_name ;
if ( rmdir( loc ) )
error( loc, "RMDIR" ) ;
}
} else if ( d & FA_RDONLY || d & FA_HIDDEN || d & FA_SYSTEM )
if ( chmod( loc, S_IREAD | S_IWRITE ) )
error( loc, "CHMOD" ) ;
}
parsfnm( "*.*", &tag, 1 ) ;
intr( 0x21, ®s ) ;
chdir( ".." ) ;
}
void main( int argc, char *argv[] ) {
if ( argc != 2 )
usage() ;
getcwd( curDir, MAXPAT ) ;
if ( attachTarget( argv[1] ) )
recusiveSearch() ;
argv[1][strlen(argv[1])-1] = 0 ;
if ( rmdir( argv[1] ) )
error( argv[1], "RMDIR" ) ;
setdisk( curDir[0] - 'A' ) ;
chdir( curDir ) ;
}